package com.android.flowoflife.thread;

import android.os.Process;

public class FlowThread {
    private Thread mThread;
    private int mTid;
    private boolean mTidSet;
    private boolean mFinished;

    synchronized private void setTid(int tid) {
        mTid = tid;
        mTidSet = true;
        FlowThread.this.notifyAll();
    }
    
    synchronized private void setFinished() {
        mFinished = true;
    }
    
    public FlowThread(final Runnable r) {
        Runnable wrapper = new Runnable() {
            public void run() {
                setTid(Process.myTid());
                try {
                    r.run();
                } finally {
                    setFinished();
                }
            }
        };

        mThread = new Thread(wrapper);
    }
    
    synchronized public void start() {
        mThread.start();
    }
    
    synchronized public void setName(String name) {
        mThread.setName(name);
    }
    
    public void join() {
        try {
            mThread.join();
        } catch (InterruptedException ex) {
            // ok?
        }
    }
    
    public long getId() {
        return mThread.getId();
    }
    
    public Thread realThread() {
        return mThread;
    }
    
    synchronized public void setPriority(int androidOsPriority) {
        while (!mTidSet) {
            try {
                FlowThread.this.wait();
            } catch (InterruptedException ex) {
                // ok, try again
            }
        }
        if (!mFinished)
            Process.setThreadPriority(mTid, androidOsPriority);
    }
    
    synchronized public void toBackground() {
        setPriority(Process.THREAD_PRIORITY_BACKGROUND);
    }
    
    synchronized public void toForeground() {
        setPriority(Process.THREAD_PRIORITY_FOREGROUND);
    }
}
